package array.prefixsum;

import java.util.HashMap;

/**
 * 和为 k 的子数组的个数
 */
public class SubArraySum {

    public int subarraySum(int[] nums, int k) {
        int n = nums.length;
        // 前缀和数组
        int[] preSum = new int[n + 1];
        preSum[0] = 0;
        // 前缀和和改前缀和出现的次数，方便快速查找所需的前缀和
        HashMap<Integer, Integer> map = new HashMap<>();
        map.put(0, 1);
        // 记录和为 k 的子数组的个数
        int res = 0;

        for (int i = 1; i <= n; i++) {
            preSum[i] = preSum[i - 1] + nums[i - 1];
            // 如果之前存在值为 need 的前缀和
            // 区间更新
            int need = preSum[i] - k;
            // 查找值为 need 的前缀和，preSum[i] - need = k,即nums[j...i - 1]和为need
            if (map.containsKey(need))
                res += map.get(need);
            // 将当前前缀和存入哈希表
            map.put(preSum[i], map.getOrDefault(preSum[i], 0) + 1);
        }
        return res;
    }
}
